assignment 2 : image to 3d fabrication.

This assignment explores methods for generating procedural noise, and then using this noise to fabricate a gradiated light filter. Procedural noise, also known as Perlin noise, is named after computer scientist Ken Perlin who invented it as an instrument for computer graphics. It is used to make things look natural, or in other words, chaotic, without actually being so. Alternative to actual chaos, as illustrated in representations such as television static, Perlin noise is designed to shift gradually between on/off values by using sin/cos oscillations.

Noise Image

P5.js has a built-in function for generating procedural noise. The code below produces the image shown left.

let z = 40; //zoom factor

function setup() {
createCanvas(650,150);
background(220);
noLoop();
noiseSeed(102); //set constant
}

draw(){
for (x = 0; x < width; x++) {
   for (y = 0; y < height; y++) {
     const noiseValue = noise(x / z, y / z);         set(x, y, color(255 * noiseValue));
    }
}}
updatePixels();
saveCanvas('png');

While Perlin Noise is a 2 dimension array of data, it's greyscale values can be used to imply a z-dimension. This is how Rhino's heightfield command works, or how displacement maps work in render environments. I was interested in fabricating the displaced version, but without first running it through a z-height displacement algorithm. Instead, I wanted to use image processing to extract the layers. Since Perlin Noise always maintains gradual transitions, I thought it would be possible to posterize the image at different threshholds to export image files, which I could then use to raster into a sheet of shaded acrylic.

Noise Image

let z = 40; //zoom factor

function setup() {
createCanvas(650,150);
background(220);
noLoop();
noiseSeed(102); //set constant
}

draw(){
for (x = 0; x < width; x++) {
   for (y = 0; y < height; y++) {
     const noiseValue = noise(x / z, y / z);
     let contour = 0;
     if (noiseValue < 0.450) {
        contour = color(255);
    }
        set(x, y, contour));
    }
}}
updatePixels();
saveCanvas('png');

Shown above is an example of a posterized layer, that cuts off at 45% (255 normalized to 1, .450 then made the cutoff).

Noise Image

I then needed to test how many rasters at X settings on Y hardware it would take to cut through the 1/4" sheet of shaded acrylic I had sourced. Shown left is an image of the test I performed. I was using an Epilog Fusion Pro laser cutter at Harvard's School of Engineer and Applied Sciences, and figured out settings which would afford me 8 layers of gradiation.

1200 DPI
100% Power
60% Speed


The DPI is important because it controls how many passes the laser will engrave. Earlier tests at 600 DPI left material in between laser passes, which could be used to alter the lighting output but for the purposes of this assignment I found it best to generate a flat surface.

Noise Image

Once I settled that I can afford 8 layers of raster images at these settings for this thickness, I adjusted my algorithm accordingly.

My first attempt didn't set a noiseSeed(); which resulted in what is shown left -- the seed is random for each layer, preventing the alignment of each layer as the posterize depths are adjusted.

Noise Image

My second attempt worked, but I noticed that the zones of white versus black were quite big and fairly unarticulated. I wanted to produce a surface that was more granulated.

Noise Image

This version is the one I settled with, which adds a zoom factor to divide the X and Ys that are being passed to the noise function. When these numbers are smaller, the frequency of the sin functions is higher, causing the distance between light and dark areas to be smaller.

Raster pass in action.

Noise Image

I needed to bolt the piece down to the bed because the heat from the raster was causing the sheet of acrylic to curl. I also thought it was best to vacuum up the debris between each raster pass.

Noise Image Noise Image

With each raster pass taking about 30 minutes, the entire fabrication process took about five hours. I sized the canvas in p5js to the aspect ratio of a photography light panel I had, so that the fabricated panel would fit to this light. I added an additional layer of translucent [light can pass through, but you can't see anything through it] white acrylic at this same dimension, to prevent the LED lights from being visible, instead just providing an even, backlit tone.

Noise Image Noise Image